<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <script>
      /***
       * 访问者模式：针对对象结构中的元素，
       * 定义在不改变对象的前提下访问结构中元素的新方法
       *
       * 访问者模式解决数据与数据的操作方法之间的耦合，将数据的操作方法独立于数据，使其可以自由化演变，
       * 因此访问者更适合于那些数据稳定，但是数据的操作方法易变的环境下，
       * 因此当操作环境发生变化时，可以自由修改操作方法以适应环境，而不需要修改原数据实现操作方法的拓展
       *
       ***/
    //  访问器
      let Visitor =(function () {
        return {
          //截取数据方法
          splice:function () {
          //  splice 方法参数，从原参数的第二个参数开始算起
            let args = Array.prototype.splice.call(arguments,1);
          //  对第一个参数对象执行splice方法
            return Array.prototype.splice.apply(arguments[0],args);
          },
        //  追加数据方法
          push:function () {
          //  强化类数组对象，使他拥有length属性
            let len = arguments[0].length | 0;
          //  添加的数据从第二个开始算起
            let args = this.splice(arguments,1);
          //  校正length属性
            arguments[0].length = len + arguments.length - 1;
          //  对第一个参数对象执行push方法
            return Array.prototype.push.apply(arguments[0],args);
          },
        //  弹出最后一次添加的元素
          pop:function (){
          //  对第一个参数对象执行pop方法
            return Array.prototype.pop.apply(arguments[0])
          }
        }
        })()

    //  例子
      let a = new Object();
      console.log(a.length);
      Visitor.push(a,1,2,3,4,5);
      console.log(a);
      Visitor.pop(a)
      console.log(a)
      Visitor.splice(a,2)
      console.log(a)
    </script>
</body>
</html>
